bash中特殊符号含义 |
您所在的位置:网站首页 › shell 叹号 事件提示符 冒号 › bash中特殊符号含义 |
bash中特殊符号含义
2022/02/ 陈信 参考: https://cloud.tencent.com/developer/article/1469049 https://www.cnblogs.com/duhuo/p/7133204.html 1. # 井号-注释注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 其他地方作为注释使用,在一行中,#后面的内容并不会被执行,除非; 但是用单/双引号包围时,#作为#号字符本身,不具有注释作用。 2. ; 分号-语句分隔作为多语句的分隔符(Command separator [semicolon])。 多个语句要放在同一行的时候,可以使用分号分隔。注意,有时候分号需要转义。 3. ;; 双分号-case语句连续分号(Terminator [double semicolon])。 在使用case选项的时候,作为每个选项的终结符。 在Bash version 4+ 的时候,还可以使用[;;&], [;&] 4. . 点号-source/正则点号(dot command [period])。 \1. 相当于bash内建命令source,如: #!/bin/bash . data-file #包含data-file;\2. 作为文件名的一部分,在文件名的开头,表示该文件为隐藏文件,ls一般不显示出来(ls -a 可以显示); \3. 作为目录名,一个点代表当前目录,两个点号代表上层目录(当前目录的父目录)。注意,两个以上的点不出现,除非你用引号(单/双)包围作为点号字符本身; \4. 正则表达式中,点号表示任意一个字符。 5. " 双引号-允许变量扩展双引号(partial quoting [double quote])。 部分引用。 双引号包围的内容可以允许变量扩展,也允许转义字符的存在。 如果字符串内出现双引号本身,需要转义,因此双引号不一定是成对的。 6. ' 单引号-禁止变量扩展单引号(full quoting [single quote])。 单引号括住的内容,被视为单一字符串,引号内的禁止变量扩展,所有字符均作为字符本身处理(除单引号本身之外),单引号必须成对出现。 7. , 逗号-数学表达式中逗号(comma operator [comma])。 \1. 用在连接一连串的数学表达式中,这串数学表达式均被求值,但只有最后一个求值结果被返回。如: #!/bin/bash let t1=((a=5+1, b=7+2)) echo t1=$t1, a=$a, b=$b ## 这个$t1=$b;\2. 用于参数替代中,表示首字母小写,如果是两个逗号,则表示全部小写,注意,这个特性在bash version 4的时候被添加的。 a="ATest" echo ${a,} echo ${a,,} ## 前面输出aTest,后面输出的是atest。 8. / 斜线-目录/除法斜线,斜杆(Filename path separator [forward slash])。 1.作为路径的分隔符,路径中仅有一个斜杆表示根目录,以斜杆开头的路径表示从根目录开始的路径; 2.在作为运算符的时候,表示除法符号。如:a=4/2 9. \ 反斜线-转义反斜线,反斜杆(escape [backslash])。 \1. 放在特殊符号之前,转义特殊符号的作用,仅表示特殊符号本身,这在字符串中常用; \2. 放在一行指令的最末端,表示紧接着的回车无效(其实也就是转义了Enter),后继新行的输入仍然作为当前指令的一部分。 10. ` 反引号/后引号-命令替换反引号,后引号(Command substitution[backquotes])。 命令替换。这个引号包围的部分为命令,可以执行包围的命令,并将执行的结果赋值给变量。 如:a=dirname '/tmp/x.log' 。 返回的结果会赋值给a,注意,此处特地使用了反引号和单引号,注意区别。 11. : 冒号-空命令冒号(null command [colon])。 空命令,这个命令什么都不做,但是有返回值,返回值为0(即:true)。这个命令的作用非常奇妙。 \1. 可做while死循环的条件; \2. 在if分支中作为占位符(即某一分支什么都不做的时候); \3. 放在必须要有两元操作的地方作为分隔符,如:: ${username=whoami} \4. 在参数替换中为字符串变量赋值,在重定向操作(>)中,把一个文件长度截断为0(:>>这样用的时候,目标存在则什么都不做),这个只能在普通文件中使用,不能在管道,符号链接和其他特殊文件中使用; \5. 甚至你可以用来注释(#后的内容不会被检查,但:后的内容会被检查,如果有语句如果出现语法错误,则会报错); \6. 你也可以作为域分隔符,比如环境变量$PATH中,或者passwd中,都有冒号的作为域分隔符的存在; \7. 你也可以将冒号作为函数名,不过这个会将冒号的本来意义转变(如果你不小心作为函数名,你可以使用unset -f : 来取消function的定义)。 12. ! 感叹号-取反感叹号(reverse (or negate) [bang],[exclamation mark])。 取反一个测试结果或退出状态。 \1. 表示反逻辑,比如后面的!=,这个是表示不等于; \2. 表示取反,如:ls a[!0-9] #表示a后面不是紧接一个数字的文件; \3. 在不同的环境里面,感叹号也可以出现在间接变量引用里面; \4. 在命令行中,可以用于历史命令机制的调用,你可以试试!$,!#,或者!-3看看,不过要注意,这点特性不能在脚本文件里面使用(被禁用)。 感叹号的使用(转义) #!/bin/bash test='hello!@#$%-test' # 注意,等号两边不能有空格,否则会将叹号当做历史命令调用来处理 echo $test echo "you !!!" test2="test2!" echo $test2 注意: shell编程里,等号两边不应该有空格(跟其他任何语言都不同,这是bash/sh等的特例). 13. * 星号-通配符/乘法星号(wildcard/arithmetic operator[asterisk])。 \1. 作为匹配文件名扩展的一个通配符,能自动匹配给定目录下的每一个文件; \2. 正则表达式中可以作为字符限定符,表示其前面的匹配规则匹配任意次; \3. 算术运算中表示乘法。 14. ** 双星号-求幂双星号(double asterisk)。算术运算中表示求幂运算。 15. ? 问号-条件测试/通配符问号(test operator/wildcard[Question mark])。 \1. 表示条件测试; \2. 在双括号内表示C风格的三元操作符((condition?true-result:false-result)); \3. 参数替换表达式中用来测试一个变量是否设置了值; \4. 作为通配符,用于匹配文件名扩展特性中,用于匹配单个字符; \5. 正则表达式中,表示匹配其前面规则0次或者1次。 16. $ 美元符-变量/行末美元符号(Variable substitution[Dollar sign])。 \1. 作为变量的前导符,用作变量替换,即引用一个变量的内容,比如:echo $PATH; \2. 在正则表达式中被定义为行末(End of line)。 17. ${}-变量参数替换(Variable substitution)。 用于在字符串中表示变量。 17. ${!#} ${@🅰️b} 参数的操作./example.sh -a 1 -b 2 -c 3 -d 参数总个数不确定,从脚本参数的第n个位置开始取参数 参数位置 获取技巧 ${@🅰️b} $# 表示参数个数,如 echo $# 1.格式 ${!#} 取最后一个参数 ${@:a:b} 从第a个参数开始取,合计取b个. 如取到最后一个,则":b"可以不写.有些类似python的切片方式.2.常见示例 ${!#} ${@:1:$#-1} ./t.sh 1001 1002 1003 1004 1005 目的要赋值给变量a=1005 , b="1001 1002 1003 1004",则脚本内容为 a=${!#} #取最后一个参数 b=${@:1:$#-1} #从第1个参数开始,合计取$#-1个. 其中$@是列表形式列出所有的传入参数; 然后:1是从第一个参数开始,后面不加任何东西的话是一直到结尾; 若加:$#-1是"$#参数总个数-1",即从第1个参数开始,合计取$#-1个参数.若要取倒数第二个参数即c=1004: c=${@😒#-1:1} #@:开始位置(倒数第2个):合计取1个 从第3个参数位置获取: directory=${@:3:$#} #从第3个参数开始,取所有(取$#个,显然取不到这么多个,但取到最后的时候,shell自动会判断结束) 其他示例说明: a=${@:2:$#-2} 从第2个开始,合计取参数个数减2个 b=${!#} 取最后一个 c=${@:$#-3:$#} 取倒数第3个位置开始,取参数总个数这么多. (能够取到的参数肯定比参数总个数少,因为是从倒数第三个开始取的.除非从第一个开始取); d=${@:$#-3} 取倒数第3个位置开始,全部取完.同上; 18. ${var:offset:number}-字符串切片扩展 字符串切片 参考: https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html 这块在上一篇讲解数组的文章中,也大概提到了Shell Parameter Expansion除了可以对数组(array)切片以外,还可以对变量切片。 格式: ${var:offset:number} ${var: length} [root@c7-server ~]# name="zhangwenlong" [root@c7-server ~]# echo ${name} zhangwenlong [root@c7-server ~]# echo ${name:2:5} angwe [root@c7-server ~]# echo ${name: -4} long 19. ${var^^} ${var,,}-字符大小写转换字符大小写转换 格式: ${var^^}:将变量var中的所有小写字符转换成大写。 ${var,,}:将变量var中的所有大写字符转换成小写。 [root@c7-server ~]# name=RenDanChaoXian[root@c7-server ~]# echo ${name^^}RENDANCHAOXIAN[root@c7-server ~]# echo ${name,,}rendanchaoxian 20. $‘...’-引用内容展开(未找到示例)$‘...’ 引用内容展开,执行单引号内的转义内容(单引号原本是原样引用的),这种方式会将引号内的一个或者多个[]转义后的八进制,十六进制值展开到ASCII或Unicode字符。 21. $*或$@-位置参数位置参数(Positional Parameters)。 这个在使用脚本文件的时候,在传递参数的时候会用到。 两者都能返回调用脚本文件的所有参数. 但$*是将所有参数作为一个整体返回(字符串); 而$@是将每个参数作为单元返回一个参数列表。 注意,在使用的时候需要用双引号将$*,$@括住。 这两个变量受到$IFS的影响,如果在实际应用中,要考虑其中的一些细节。 补充: shell特殊 参数 变量 $#,$@,$*,$$,$?,$0,$1的含义解释 整理时间: 20180718 Chenxin shell的特殊字符 $# 是传给脚本的参数个数(不含脚本文件自身) $0 是脚本本身的名字 $1~$n 是传递给该shell脚本的第1-n个参数 $@ 所有参数列表.以"$1" "$2" … "$n" 的形式输出所有参数。 $* 所有参数列表.以"$1 $2 … $n"的形式输出所有参数。是以一个单字符串显示所有向脚本传递的参数. $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 ${!#} 输出最后一个参数 $! Shell最后运行的后台Process的PID 完整的特殊字符含义: https://linux.cn/article-5657-1.html 21. $#-参数数量表示传递给脚本的参数数量。 22. $?-返回值此变量值在使用的时候,返回的是最后一个命令、函数、或脚本的退出状态码值,如果没有错误则是0,如果为非0,则表示在此之前的最后一次执行有错误。 23. $$-进程PID进程ID变量,这个变量保存了运行当前脚本的进程ID值。 24. ()-命令组subshell/数组初始化圆括号(parentheses)。 1, 命令组(Command group)。由一组圆括号括起来的命令是命令组,命令组中的命令是在子shell(subshell)中执行。因为是在子shell内运行,因此在括号外面是没有办法获取括号内变量的值,但反过来,命令组内是可以获取到外面的值,这点有点像局部变量和全局变量的关系,在实际中,如果碰到要cd到子目录操作,并在操作完成后要返回到当前目录的时候,可以考虑使用subshell来处理; \2. 用于数组的初始化。 25. {x,y,z,...} 花括号扩展花括号扩展(Brace Expansion)。 在命令中可以用这种扩展来扩展参数列表,命令将会依照列表中的括号分隔开的模式进行匹配扩展。注意的一点是,这花括号扩展中不能有空格存在,如果确实有必要空格,则必须被转义或者使用引号来引用。 例子: chenxin@yunwei-01:~$ echo {a,b,c}-{\ d," e",' f'}a- d a- e a- f b- d b- e b- f c- d c- e c- f 26. {a..z} 花括号扩展在Bash version 3时添加了这种花括号扩展的扩展,可以使用{A..Z}表示A-Z的所有字符列表,这种方式的扩展测试了一下,好像仅适用于A-Z,a-z,还有数字{最小..最大}的这种方式扩展。 27. {} 代码块代码块(curly brackets)。 这个是匿名函数,但是又与函数不同,在代码块里面的变量在代码块后面仍能访问。 注意: 花括号内侧需要有空格与语句分隔。 另外,在xargs -i中的话,还可以作为文本的占位符,用以标记输出文本的位置。 { cmd1;cmd2; } :指令以当前进程pid执行; (cmd1;cmd2) :指令以子进程pid执行; 28. {} ; 貌似只在find里用这个{}是表示路径名,这个并不是shell内建的,现在接触到的情况看,好像只用在find命令里。 注意后面的分号,这个是结束find命令中-exec选项的命令序列,在实际使用的时候,要转义一下,以免被shell理解错误。 29. [] 中括号-测试/数组元素/正则中括号(brackets)。 \1. 测试的表示,Shell会测试在[]内的表达式,需要注意的是,[]是Shell内建的测试的一部分,而非使用外部命令/usr/bin/test的链接; \2. 在数组的上下文中,表示数组元素,方括号内填上数组元素的位置就能获得对应位置的内容,如: chenxin@yunwei-01:~$ Array[1]=xxxchenxin@yunwei-01:~$ echo ${Array[1]};xxx\3. 正则中,表示字符集的范围,方括号表示该位置可以匹配的字符集范围。 30. [[]] 双中括号双中括号(double brackets)。 这个结构也是测试,测试[[]]之中的表达式(Shell的关键字)。 这个比单中括号更能防止脚本里面的逻辑错误,比如:&&,||,操作符能在一个[[]]里面测试通过,但是在[]却不能通过。[[]]里面没有文件名扩展(filename expansion)或是词分隔符(Word splitting),但是可以用参数扩展(Parameter expansion)和命令替换(command substitution)。不用文件名通配符和像空白这样的分隔符。注意,这里面如果出现了八进制,十六进制等,shell会自动执行转换比较。 31. $[...] 整数扩展,类似$(())词表达表示整数扩展(integer expansion)。 在方括号里面执行整数表达式。例: chenxin@yunwei-01:~$ a=3chenxin@yunwei-01:~$ b=7chenxin@yunwei-01:~$ echo $[$a+$b]10chenxin@yunwei-01:~$ echo $[$a*$b]21##返回是10和21##这种很类似$(())的方式chenxin@yunwei-01:~$ echo $((a+b))10chenxin@yunwei-01:~$ echo $((a*b))21chenxin@yunwei-01:~$ echo $(( a * b ))21 32. (()) 双小括号,整数扩展双括号(double parentheses)。 表示整数扩展(integer expansion)。 功能和上面的$[]差不多,但是需要注意的是,$[]是会返回里面表达式的值的,而(())只是执行,并不会返回值。 两者执行后如果变量值发生变化,都会影响到后继代码的运行。可对变量赋值,可以对变量进行一目操作符操作,也可以是二目,三目操作符。 33. > , &< ,>&,>>,filename 重定向scriptname的输出到文件filename中去,如果文件存在则覆盖;command &>filename 重定向command的标准输出(stdout)和标准错误(stderr)到文件filename中; command >&2 把command的标准输出(stdout)重定向到标准错误(stderr)中; scriptname >>filename 把scriptname的输出(同>)追加到文件filenmae中,如果文件不存在则创建。 [i]filename 打开filename这个文件用来读或者写,并且给文件指定i为它的文件描述符(file descriptor),文件不存在就会创建。 34. (command)>, |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |